// 只有+ - * / 的算术表达式计算
#include <iostream>
#include <string>
#include "../基础数据结构实现/Sqstack.cpp"  // 完成字符窜的解析

using namespace std;

void trans(char * exp,char *  postexp);

int main()
{
    char exp [] = "(56 - 20)/(4 + 2)";
    char postexp[MaxSize];

    trans(exp,postexp);

    printf("中缀表达式：%s\n",exp);
    printf("后缀表达式：%s\n",postexp);
    // printf("表达式的值：%g\n",compvalue(postexp));
    return 0;
}

// 转化为后缀表达式
void trans(char * exp,char *  postexp)
{
    char e;
    SqStack * Opst;
    InitStack(Opst);  // 现在栈中数组的内容是一个随机值
    
    int i = 0;
    while(*exp!='\0')
    {
        switch(*exp)
        {
            case '(':
            Push(Opst,'(');
            exp++;
            break;

            case ')':
            Pop(Opst, e);
            while (e != '(' )
            {
                postexp[i++] = e;
                Pop(Opst,e);
            }
            exp++;
            break;
            // 如何区分 + - 和 * / 在后缀表达式中的优先级?
            
            case '+':
            case '-':
                while (!StackEmpty(Opst))
                {
                   GetTop(Opst,e);
                   if (e != '(' )
                   {
                       postexp[i++] = e;
                       Pop(Opst,e);
                   }
                   else break;

                }
            Push(Opst,e);
            exp++;
            break;
            
            case '*':
            case '/':
                while (!StackEmpty(Opst))
                {
                    
                    GetTop(Opst,e);
                    if(e == '*' || e == '/')
                    {
                        postexp[i++] = e;
                        Pop(Opst,e);
                    }

                    else break;
                }
                Push(Opst,e);
                exp++;
                break;
               
            default:
                while (*exp >='0' && *exp <= '9')  // 处理数字字符
                {
                    postexp[i++] = *exp;
                    exp++;
                }
                postexp[i++] = '#';
                break;
                
        }
    }
    // exp表达遍历完成后 栈中仍然可能有保存的内容 并未弹出
    while(! StackEmpty(Opst))
    {
        Pop(Opst,e);

        postexp[i++] = e;
    }

    postexp[i++] = '\0'; // 以字符串的形式存储，添加结束标志便于循环
    DestoryStack(Opst);
}

// 根据后缀表达式求值
double compvalue(char * postexp)
{

}